JavaScript 其中一大謎團,就是關於它到底屬於直譯式還是編譯式語言。
那麼首先,就來簡單定義一下這兩者:
程式運行時從上到下,一行接一行將原始碼翻譯成機器語言,也就是讀完一行程式碼,機器就執行一個動作,執行速度相對要慢。
執行前將整份程式碼翻譯成機器語言,隨後再運行。執行速度相較更快,但開發、除錯速度較慢。
原始碼(Source code):指人類能夠閱讀的電腦語言指令,通常由工程師直接撰寫。
機器語言(machine language):即電腦的 CPU 可直接解讀的資料,有時也被稱為原生碼(native code)
所以說,JavaScript 到底是哪一種?
MDN 文件中寫到:
「JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language」
這裡挑出兩個關鍵字:
根據查到的資料,JavaScript 最初是直譯式語言,後來為了加快執行速度,慢慢進化為「即時編譯」。
即時編譯也常簡稱為 JIT,這種技術混合了編譯語言與直譯語言的優點,會先把程式原始碼編譯成中介碼(bytecode,也稱位元組碼或字節碼)。等到執行時,再將中介碼直譯為機器語言執行。
比較特別的是,跟一般編譯型語言不同,JIT 不會將編譯好的結果生成一份檔案存在磁碟中,而是直接將編譯完的結果儲存在記憶體,隨後馬上執行。
因此經歷第一次執行並快取編譯結果後,第二次以後的執行速度會加快。當記憶體不足時,系統會刪除部分代碼,並在需要時重新生成。
所以說,JS 確實經歷過編譯,而且是在「將要執行之前,以極快地速度編譯完畢」。
下一章就來聊聊,編譯時期程式具體都做了些什麼。